#pragma once

#include "coroutine.hpp"
#include "conqueue.hpp"
#include <mutex>
#include <deque>

namespace jizhe {


class Processor {
public:

struct Task {
    Coroutine::ptr task_co;
    std::function<void()> task_func;

    Task() { task_co = nullptr; task_func = nullptr; }
    Task(Coroutine::ptr co) { task_co = co; }
    Task(std::function<void()> f) { task_func = f; }

    void reset() {
        task_co = nullptr;
        task_func = nullptr;
    }
};



private:
    // 调度器id
    uint64_t m_id;
    // 调度协程
    Coroutine::ptr m_co;
    // 本地任务队列 (线程安全)
    ConQueue<Task*, std::deque<Task*>> m_local_que;
    // // 全局任务队列锁
    // std::mutex m_gloabl_mu;
    // // 全局任务队列
    // ConQueue* m_global_que = nullptr;

public:
    /**
     * @brief 添加任务到当前线程的调度器
    */
    static void schedule(Task* task);
    static void schedule(std::function<void()> func);
    static void schedule(Coroutine co);

    Processor();
    
    void run();
    /**
     * @brief 添加任务到该调度器
    */
    void addTask(Task* task);
    void addTask(std::function<void()> func);
    void addTask(Coroutine co);
};

} // namespace jizhe